package com.ushine.web.template.mybatis.service.impl;

import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;
import java.util.function.Function;

/**
 * @Author: yls
 * @Date 2022/2/8 13:22
 * @Description: 利用map和函数式接口结合的方式减少if-else的嵌套
 * @Version 1.0
 **/
@Service
public class MapFunctionServiceImpl {

    @Resource
    private FunctionTypeServiceImpl functionTypeService;

    /**
     * 将给定的参数应用到这个函数上,
     * 传入的参数类型为T返回类型为R
     * <p>
     * Function<T,R>
     */
    private Map<Integer, Function<Object, String>> functionTypeMap = new HashMap<>();


    @PostConstruct
    public void initMapFunctionService() {
        // 类型一
        functionTypeMap.put(1, params -> functionTypeService.typeFirst(params));
        // 类型二
        functionTypeMap.put(2, params -> functionTypeService.typeSecond(params));
        // 类型三
        functionTypeMap.put(3, params -> functionTypeService.typeThird(params));
    }

    /**
     * 功能描述:
     * 〈 具体的业务逻辑调用 〉
     *
     * @param typeName 类型名称
     * @param params   参数列表
     * @return : java.lang.String
     * @author : yls
     * @date : 2022/2/8 13:45
     */
    public String getResultByTypeName(Integer typeName, Object params) {
        Function<Object, String> function = functionTypeMap.get(typeName);
        if (function != null) {
            return function.apply(params);
        }
        return "未找到对应类型的业务处理";
    }
}
